package com.sym.demo.pattern.sington;

/**
 * 懒汉
 *
 * 相比饿汉式，懒汉式显得没那么“饿”，在真正需要的时候再去创建实例。
 * 在getInstance方法中，先判断实例是否为空再决定是否去创建实例，看起来似乎很完美，但是存在线程安全问题。
 *
 * 所以:
 * 这里采用了双重校验的方式，对懒汉式单例模式做了线程安全处理。通过加锁，可以保证同时只有一个线程走到第二个判空代码中去，这样保证了只创建 一个实例。
 * 这里还用到了volatile关键字来修饰singleton,其最关键的作用是防止JVM的JIT指令重排。
 * @author suyongming
 * @date ：2021/3/7 16:23
 */
public class LANHAN_Singleton {
    private static volatile LANHAN_Singleton singleton;

    private LANHAN_Singleton() {
    }

    public static LANHAN_Singleton getSingleton() {
        if (singleton == null) {
            synchronized (LANHAN_Singleton.class) {
                if (singleton == null) {
                    singleton = new LANHAN_Singleton();
                }
            }
        }
        return singleton;
    }
}
